package com.example.hello.service.impl;

import com.example.hello.mapper.UserMapper;
import com.example.hello.pojo.LoginInfo;
import com.example.hello.pojo.User;
import com.example.hello.service.LoginService;
import com.example.hello.util.JwtUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Service
public class LoginServiceImpl implements LoginService {

    @Autowired
    private UserMapper userMapper;

    // 用于密码校验
    private BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

    @Override
    public LoginInfo login(String phone, String password) {
        // 根据手机号查询用户
        User user = userMapper.findByPhone(phone);
        if (user == null) {
            return null;
        }
        // 使用 BCrypt 校验密码
        if (!passwordEncoder.matches(password, user.getPassword())) {
            return null;
        }
        // 密码匹配成功，更新最后登录时间
        Date now = new Date();
        user.setLastLoginAt(now);
        userMapper.updateLastLoginTime(user.getId(), now);

        // 生成登录令牌（这里简单使用 UUID 生成，实际可使用 JWT 或其它方案）
        Map<String,Object> claims = new HashMap<>();
        claims.put("id",user.getId());
        claims.put("phone",user.getPhone());
        claims.put("role",user.getRole());
        String token = JwtUtils.generateJwt(claims);

        // 构造 LoginInfo 对象
        LoginInfo loginInfo = new LoginInfo();
        // 此处 user.getId() 是 Long，将其转换为 int（注意大数据量时可能丢失精度）
        loginInfo.setId(user.getId().intValue());
        loginInfo.setPhone(user.getPhone());
        loginInfo.setRole(user.getRole());
        loginInfo.setNickname(user.getNickname());
        loginInfo.setAvatar(user.getAvatar());
        loginInfo.setGender(user.getGender());
        loginInfo.setLocale(user.getLocale());
        loginInfo.setStatus(user.getStatus());
        loginInfo.setToken(token);

        return loginInfo;
    }
}